package sifeap.bl.ejb.simulador;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import sifeap.bridge.CreditosBridge;
import sifeap.dal.ejb.solicitudescredito.TipoCreditoDALLocal;
import sifeap.entities.simulador.valueobject.SimuladorVO;
import sifeap.entities.solicitudescredito.SolicitudCredito;
import sifeap.entities.solicitudescredito.TipoCredito;
import sifeap.wrappers.asociados.VinculadoWrapper;
import sifeap.wrappers.creditos.TipoCreditoWrapper;

/**
 * Session Bean implementation class EventoBL
 */
@Stateless(name="SimuladorBL")
public class SimuladorBL implements SimuladorBLLocal {
    @EJB
    TipoCreditoDALLocal tipoCreditoDAL;
	
	/**
     * Default constructor. 
     */
    public SimuladorBL() {}

	@Override
	public SimuladorVO simularCredito(SimuladorVO simulador, SolicitudCredito solicitudCredito, VinculadoWrapper asociado, boolean soloCalcularCupo) {
		//Suma Sueldo basico y otros ingresos
		if (solicitudCredito.getOtrosIngresos() != null) {
			simulador.setTotalIngresos(asociado.getSueldoBasico().longValue() + solicitudCredito.getOtrosIngresos().longValue());
		} else {
			simulador.setTotalIngresos(asociado.getSueldoBasico().longValue());
		}
		
		//Calcula las cuotas maximas mensuales y quincenales
		if (simulador.getTotalIngresos() != null) {
			simulador.setDescuentoMensual((long) (simulador.getTotalIngresos().longValue() * 0.25f));
			simulador.setDescuentoQuincenal((long) (simulador.getTotalIngresos().longValue() * 0.125f));
		}
		
		//Calcula el cupo disponible
		if (simulador.getTotalDescuentos() != null) {
			simulador.setCupoDisponible((long) (simulador.getDescuentoQuincenal().longValue() - simulador.getTotalDescuentos().doubleValue()));
		} else {
			simulador.setCupoDisponible(simulador.getDescuentoQuincenal().longValue());
		}
		
		if (soloCalcularCupo) {
			return simulador;
		}
		
		//Calcula la cuota quincenal (sin intereses ni seguro)
		double cuotaQuincena = solicitudCredito.getMontoSolicitado() / solicitudCredito.getPlazo();
		
		//Calcula el interes
		TipoCredito tipoCredito = tipoCreditoDAL.buscar(solicitudCredito.getTiposcredito().getIdTipoCredito());
		TipoCreditoWrapper tipoCreditoWp = new CreditosBridge().obtenerTipoCredito(tipoCredito.getIdTipoCreditoSolidario());
		
		float tasaInteres = 0f; //En porcentaje
		float tasaSeguro = 0f; //En porcentaje
		if (tipoCreditoWp != null) {
			tasaInteres = tipoCreditoWp.getInteres();
			tasaSeguro = tipoCreditoWp.getSeguro();
		}
		
		double interes = ((solicitudCredito.getMontoSolicitado() * tasaInteres) / 100)/2;
		double seguro = ((solicitudCredito.getMontoSolicitado() * tasaSeguro) / 100)/2;
		
		double valorCuota = cuotaQuincena + interes + seguro;
		
		simulador.setValorCuota((long) valorCuota);
		
		//Evalua el resultado
		if (simulador.getCupoDisponible().longValue() >= simulador.getValorCuota().longValue()) {
			//Es viable
			simulador.setResultadoSimulacion(true);
		} else {
			//No es viable
			simulador.setResultadoSimulacion(false);
		}
		
		return simulador;
	}
}
